Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Шрифт:
Интервал:
Закладка:

То есть значения столбиков – это суммарные значения серий.
В этой диаграмме нужно внимательно устанавливать верхнее ограничение значений по числовой оси.
Кроме того, в этой диаграмме отсутствует свойство barGap, есть только свойство categoryGap.
Класс BubbleChart представляет пузырьковую диаграмму с числовыми осями NumberAxis.

Класс BubbleChart имеет, помимо унаследованных от класса Chart, свойства, унаследованные от класса XYChart.
Для диаграммы BubbleChart можно использовать свойство extraValue класса XYChart. Data, с помощью которого можно регулировать размер пузырька диаграммы.
Приведенный здесь код демонстрирует пример создания пузырьковой диаграммы.
Для диаграммы BubbleChart создаются горизонтальная и вертикальная оси NumberAxis, для которых определяются такие свойства как подпись оси, цвет подписей к меткам оси и так далее.

Диаграмма BubbleChart помещается в левый верхний угол и для нее устанавливаются такие свойства как курсор мышки, стиль, предпочтительные размеры, заголовок и его расположение, отображение и расположение панели пояснений к диаграмме, отсутствие выделения через один столбцов и строк сетки диаграммы, отображение вертикальных линий сетки диаграммы.
Для диаграммы BubbleChart создаются три именованные серии данных, элементы которых после добавления в диаграмму масштабируются по вертикали.

Класс LineChart представляет диаграммы двухмерных графиков, которые отличаются от диаграмм AreaChart тем, что области под графиками не выделены цветом.

Класс LineChart имеет, помимо унаследованных от класса Chart, свойства, унаследованные от класса XYChart и собственное свойство createSymbols.
Если свойство createSymbols установлено со значением false, тогда элементы данных никак не выделяются на графике, который отображается в виде тренда.
Приведенный здесь код демонстрирует пример создания диаграммы с графиками.
Для диаграммы LineChart создаются горизонтальная ось CategoryAxis и вертикальная ось NumberAxis, для которых определяются такие свойства как подпись оси, цвет подписей к меткам оси и так далее.
Диаграмма LineChart помещается в левый верхний угол и для нее устанавливаются такие свойства как курсор мышки, стиль, предпочтительные размеры, заголовок и его расположение, отображение и расположение панели пояснений к диаграмме, выделение через один столбцов сетки диаграммы, отображение линий сетки диаграммы и отображение графиков в виде трендов.

Для диаграммы LineChart создаются две именованные серии данных.

Здесь мы создаем три узла данных серии, представленные текстом.
И заполняем серию данными с использованием этих узлов.
При этом числовые данные оси Y привязываются к строковым категориям оси X.
В конце серии добавляются в диаграмму.
Класс ScatterChart представляет диаграмму рассеяния, используемую для исследования зависимости между двумя видами данных.

Класс ScatterChart имеет, помимо унаследованных от класса Chart, свойства, унаследованные от класса XYChart.
Приведенный здесь код демонстрирует пример создания диаграммы рассеяния.
Для диаграммы ScatterChart создаются горизонтальная и вертикальная оси NumberAxis, для которых определяются такие свойства как подпись оси, цвет подписей к меткам оси и так далее.
Диаграмма ScatterChart помещается в левый верхний угол и для нее устанавливаются такие свойства как курсор мышки, стиль, предпочтительные размеры, заголовок и его расположение, отображение и расположение панели пояснений к диаграмме, выделение через один столбцов сетки диаграммы и отображение линий сетки диаграммы.

Для диаграммы ScatterChart создаются две именованные серии данных.

И эти серии добавляются в диаграмму.
Выполнение фоновых задач
Для выполнения определенной работы, занимающей значительное время процессора, в отдельном потоке от потока JavaFX Application Thread, для того чтобы не блокировать GUI-интерфейс JavaFX-приложения, платформа JavaFX предлагает использовать пакет concurrent.


Граф сцены JavaFX, представляющий графический пользовательский интерфейс приложения JavaFX, не является потокобезопасным и может быть доступен и изменен только из потока пользовательского интерфейса JavaFX Application Thread.
Реализация долго выполняющихся задач в потоке приложения JavaFX неизбежно делает пользовательский интерфейс приложения невосприимчивым.
Поэтому лучшей практикой является выполнение этих задач на одном или нескольких фоновых потоках и использование потока приложения JavaFX для обработки пользовательских событий.
Работу с фоновыми потоками пакет concurrent обеспечивает с помощью двух абстрактных классов Task и Service, реализующих интерфейс Worker.
Интерфейс Worker определяет объект, который выполняет некоторую работу в одном или нескольких фоновых потоках.
Состояние объекта Worker является наблюдаемым и может использоваться из потока приложения JavaFX.
Жизненный цикл объекта Worker определяется следующим образом.
При создании объект Worker находится в состоянии READY.
При планировании работы объект Worker переходит в состояние SCHEDULED.
После этого, когда объект Worker выполняет работу, его состояние становится RUNNING.
Даже когда объект Worker немедленно запускается без планирования, он сначала переходит в состояние SCHEDULED, а затем в состояние RUNNING.
Состояние объекта Worker, которое завершается успешно, является SUCCEEDED, а свойство value установлено как результат этого объекта Worker.
В противном случае, если во время выполнения объекта Worker выбрасываются какие-либо исключения, его состояние становится FAILED, а для свойства исключения устанавливается тип произошедшего исключения.
В любое время, до завершения объекта Worker разработчик может прервать его, вызвав метод cancel, который помещает объект Worker в состояние CANCELED.
Прогресс работы, выполняемый объектом Worker, может быть получен с помощью трех различных свойств, таких как totalWork, workDone и progress.
Абстрактный класс Task расширяет класс java.util.concurrent. FutureTask, и конкретные реализации абстрактного класса Task должны переопределять его метод call, вызываемый средой выполнения в фоновом потоке.

Результатом выполнения задачи Task в фоновом потоке является объект V, возвращаемый методом call.
Результат выполнения фоновой задачи может быть получен с помощью метода getValue класса Task.
В методе call разрешено вызывать только методы updateProgress, updateMessage и updateTitle класса Task, обновляющие текущее количественное выполнение задачи, максимальное количественное выполнение задачи, текущее процентное выполнение задачи, сообщение, связанное с текущим состоянием выполнения задачи, и заголовок данной задачи.
В то время как метод call выполняется в фоновом потоке, методы updateProgress, updateMessage и updateTitle класса Task выполняются в потоке JavaFX Application Thread.
Поэтому, переопределяя данные методы в конкретной реализации абстрактного класса Task и обеспечивая их вызов в методе call, можно передавать значения свойств workDone, totalWork, progress, message и title из фонового потока в поток JavaFX Application Thread.
Запуск экземпляра пользовательского класса, расширяющего класс Task, и соответственно вызов его метода call может быть выполнен различными способами.
Так как класс Task расширяет класс FutureTask, то запуск его экземпляра может быть осуществлен с помощью объекта java.lang.Thread.
Запуск объекта Task также может быть произведен с помощью программного интерфейса Java Executor API.
В этом случае необходимо создать объект java.util.concurrent. ExecutorService с помощью класса-фабрики java.util.concurrent. Executors и воспользоваться методом submit интерфейса ExecutorService для запуска объекта Task.
Для завершения работы объекта ExecutorService нужно применить метод shutdown интерфейса ExecutorService.
Помимо перечисленных выше способов, создание и запуск объекта Task обеспечивает сервисный класс Service пакета concurrent.
Абстрактный класс Service также необходимо расширять конкретной реализацией с переопределением его метода createTask, возвращающего объект Task.
